最近、Enterprise Libraryの話を何カ所かで見かけています。
少しは知っておかねばならないかな、と思って試してみました。
理屈より手を動かすBody First主義で、とりあえずソースを1本。
これにはいくつかの機能がありますが、自分も使うかも知れないConfigurationの機能を試してみました。XML文書に設定を保存する機能です。
サンプルソース §
Visual Studio.NET 2003用のC#のソースです。Enterprise LibraryのMicrosoft.Practices.EnterpriseLibrary.Configuration.dllへの参照を追加しておく必要があります。
using System;
using System.IO;
using Microsoft.Practices.EnterpriseLibrary.Configuration;
namespace ConsoleApplication51
{
public class TestData
{
// アクセサ略
public string SampleString;
public int SampleInteger;
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
// ゼロからConfigurationManager.WriteConfigurationメソッドで
// ファイルを書き出すことができない
// (ファイルの不在はチェックされ例外になる。
// チェックされるのは不在だけで中身は問われない)
// とりあえずダミーのファイルがあれば動くので準備
using( StreamWriter writer = File.CreateText(@"..\..\t1.config") )
{
writer.WriteLine("dummy");
}
// 保存するデータを持つオブジェクトを準備
TestData testData1 = new TestData();
testData1.SampleString = "sample";
testData1.SampleInteger = 1234;
// app.configで指定したファイルに書き出す
ConfigurationManager.WriteConfiguration("t1", testData1);
// app.configで指定したファイルから読み出す
TestData testData2 =
(TestData)ConfigurationManager.GetConfiguration("t1") ;
// 読み出したデータをコンソールに出力して確認
Console.WriteLine(testData2.SampleString);
Console.WriteLine(testData2.SampleInteger);
}
}
}
app.config §
実行には、app.configファイルが必要です。
強調部分が保存ファイルのパス指定です。
行が過剰に長くなりすぎるので、preによるフォーマットは断念します。読みにくくなると思いますが……。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="enterpriselibrary.configurationSettings" type="Microsoft.Practices.EnterpriseLibrary.Configuration.ConfigurationManagerSectionHandler, Microsoft.Practices.EnterpriseLibrary.Configuration" />
</configSections>
<enterpriselibrary.configurationSettings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" defaultSection="" applicationName="Application" xmlns="http://www.microsoft.com/practices/enterpriselibrary/08-31-2004/configuration">
<configurationSections>
<configurationSection name="t1" encrypt="false">
<storageProvider xsi:type="XmlFileStorageProviderData" name="XML File Storage Provider" path="../../t1.config" />
<dataTransformer xsi:type="XmlSerializerTransformerData" name="Xml Serializer Transformer">
<includeTypes />
</dataTransformer>
</configurationSection>
</configurationSections>
<keyAlgorithmStorageProvider xsi:nil="true" />
</enterpriselibrary.configurationSettings>
</configuration>
実行結果 §
sample
1234
実行後に生成されているt1.configの内容 §
<?xml version="1.0" encoding="utf-8"?>
<t1>
<xmlSerializerSection type="ConsoleApplication51.TestData, ConsoleApplication51, Version=1.0.1955.28715, Culture=neutral, PublicKeyToken=null">
<TestData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SampleString>sample</SampleString>
<SampleInteger>1234</SampleInteger>
</TestData>
</xmlSerializerSection>
</t1>
解説 §
一見、ソースコードを見ると、ほとんど何も書かないで実現できているかのように見えます。ConfigurationManager.WriteConfigurationメソッドで書いて、ConfigurationManager.GetConfigurationメソッドで読んでいるだけ。
しかし、実際にはapp.configの方に、ファイルを保存するパス名など、かなりの情報を必要としているようです。(app.configに関しては、何が必要とされる記述か全て把握できていません)
適応性、あるいは感想 §
とりあえず現状で把握できた範囲から言えば、この機能は、app.configをカスタマイズして利用するタイプのシステムで使う場合に有効と感じます。ソースコードを直さずとも、app.configを直すだけで挙動をかなり変えられると思われます。
一方で、コンシューマ向けのソフトという観点から言うと、素人の一般ユーザにapp.configを書き換えさせるなど、現実的な選択とは言えません。ユーザーがカスタマイズできる機能は、プログラムが親切に設定インターフェースを提供しなければなりません。そのような用途には、この機能は向かないような気がします。
つまり、それゆえに、"Enterprise" Libraryという名前なのかも知れません。
不明点 §
大きいライブラリなので、まだ不明点だらけです。
今回の件で、曖昧なまま残ったのは、ファイルを保存する際にファイルの不在をチェックしていることです。ConfigurationManager.WriteConfigurationメソッドは、書き込もうとするファイルが存在しない場合は、例外を投げます。かといって、ファイルの内容は全く見ていないようで、ダミーのファイルがあるだけで通ります。いかなる意図でファイルの不在をチェックしているのかは、一応、チェックすべき項目として頭に入れておきましょう。
というわけで、まだ把握し切れていないことだらけで、良いとも悪いとも判断が付きません。